/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2002-2006
* Sleepycat Software. All rights reserved.
*
* $Id: LockInfo.java,v 1.1 2006/05/06 08:59:06 ckaestne Exp $
*/
package com.sleepycat.je.txn;
import java.util.Collections;
import java.util.Map;
import java.util.WeakHashMap;
import com.sleepycat.je.utilint.Tracer;
/**
* LockInfo is a class that embodies information about a lock instance. The
* holding thread and the locktype are all contained in the object.
*/
public class LockInfo implements Cloneable {
private Locker locker;
private LockType lockType;
private static boolean deadlockStackTrace = false;
private static Map traceExceptionMap =
Collections.synchronizedMap(new WeakHashMap());
private static class StackTraceAtLockTime extends Exception {}
/**
* Called when the je.txn.deadlockStackTrace property is changed.
*/
static void setDeadlockStackTrace(boolean enable) {
deadlockStackTrace = enable;
}
/**
* For unit testing only.
*/
public static boolean getDeadlockStackTrace() {
return deadlockStackTrace;
}
/**
* Construct a new LockInfo. public for Sizeof program.
*/
public LockInfo(Locker locker, LockType lockType) {
this.locker = locker;
this.lockType = lockType;
if (deadlockStackTrace) {
traceExceptionMap.put(this, new StackTraceAtLockTime());
}
}
/**
* Change this lockInfo over to the prescribed locker.
*/
void setLocker(Locker locker) {
this.locker = locker;
}
/**
* @return The transaction associated with this Lock.
*/
Locker getLocker() {
return locker;
}
/**
* @return The LockType associated with this Lock.
*/
void setLockType(LockType lockType) {
this.lockType = lockType;
}
/**
* @return The LockType associated with this Lock.
*/
LockType getLockType() {
return lockType;
}
public Object clone()
throws CloneNotSupportedException {
return super.clone();
}
/**
* Debugging
*/
public void dump() {
System.out.println(this);
}
public String toString() {
StringBuffer buf = new StringBuffer(500);
buf.append("<LockInfo locker=\"");
buf.append(locker);
buf.append("\" type=\"");
buf.append(lockType);
buf.append("\"/>");
if (deadlockStackTrace) {
Exception traceException = (Exception) traceExceptionMap.get(this);
if (traceException != null) {
buf.append(" lock taken at: ");
buf.append(Tracer.getStackTrace(traceException));
}
}
return buf.toString();
}
}